package com.itools.core.service;

import com.itools.core.base.CommonResult;
import com.itools.core.param.FmsUploadTokenParam;
import com.itools.core.result.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * @project: itools-backend
 * @description:
 * @author: XUCHANG
 * @create: 2021-04-02 16:34
 */
public interface FileHandleService {
    /**
     * 根据申请的文件token获取返回的上传文件的类型信息
     * @param fileToken 文件token
     * @return
     */
    CommonResult<FmsUploadTokenResult> getFileDetailByToken(String fileToken);

    /**
     * 文件策略为NIO
     * 执行文件写入和上传
     * @param file 文件
     * @param param 上传参数
     * @param uploadToken 访问token
     * @param originalFilename 原文件名称
     * @return
     */
    CommonResult<FmsFileUploadResult> saveFileForNio(MultipartFile file, FmsUploadTokenParam param, String uploadToken, String originalFilename);

    /**
     * 文件策略为NIO
     * 执行文件写入和上传
     * @param files 文件
     * @param uploadToken 访问token
     * @param uploadTokenParam 上传参数,文件的限制
     * @return
     */
    CommonResult<List<FmsMultipartFileResult>> saveFileForNio(MultipartFile[] files, String uploadToken, FmsUploadTokenParam uploadTokenParam);

    /**
     * 将文件持久化到数据库
     * @param file 文件
     * @param fmsUploadTokenParam 文件的类型等信息
     * @param uuid 文件唯一id
     * @return
     */
    CommonResult<String> createAndPersistDBRecord(MultipartFile file, FmsUploadTokenParam fmsUploadTokenParam, String uuid);

    /**
     * 获取文件访问路径
     * @param uniqueIds List文件唯一id
     * @param expiredTime 过期时间
     * @param maxAccessCount 最大访问次数
     * @param type 文件下载 download/展示 show
     * @return
     */
    CommonResult<List<FmsFileRecordPathResult>> getFileUrlByUniqueIds(List<String> uniqueIds, Integer expiredTime, Integer maxAccessCount, String type);
    /**
     * 根据文件唯一id查询文件的上传记录
     * @param uniqueIds 文件唯一id
     * @return
     */
    CommonResult<List<FmsDetailRecordResult>> queryFileRecordsByUniqueIds(List<String> uniqueIds);
    /**
     * 根据文件唯一id查询文件的上传记录
     * @param uniqueId 文件唯一id
     * @return
     */
    CommonResult<FmsDetailRecordResult> getFileUploadRecord(String uniqueId);

    /**
     * 下载文件
     * @param uniqueId 文件唯一id
     * @param fileAccessToken 文件的访问token
     * @param response
     */
    void downloadFileNio(String fileAccessToken, HttpServletResponse response, String uniqueId);
}
